﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Kuvankatselin
{
    public delegate void KuvanSiirtoEventHandler(object o, KuvanSiirtoEventArgs e);
    
    public class KuvanSiirtoEventArgs : EventArgs
    {
        public readonly Kuva tapahtuma_kuva;
        public readonly int suunta; // Mihin suuntaan tapahtuma on kulkenut, eli poistetaanko vai lisätäänkö kuva listaan
        public KuvanSiirtoEventArgs(Kuva tk, int _suunta)
        {
            // 1 = POis
            // 2 = Sisään
            suunta = _suunta;
            tapahtuma_kuva = tk;
        }
    }

	/// <summary>
	/// Interaction logic for Kuva.xaml
	/// </summary>
	public partial class Kuva : UserControl
	{

        public event KuvanSiirtoEventHandler KuvanSiirtoTapahtuma;

        // Kuvan osoite uudelleenrenderöintiä varten
        private string kuvanOsoite;
        // Onko kuva piirtoalueella vai "varastossa"
        private bool onPiirtoAlueella;
        // Kuvan alkuperäiset tiedot
        private int korkeus;
        private int leveys;

        // Kuvan tarttumiskohat
        private double hiiriSijaintiX;
        private double hiiriSijaintiY;

        // Kuvan piirtoalue, Canvas
        private Canvas piirtoalue;
        private bool valittu;

		public Kuva(string _kuvanOsoite)
		{
			this.InitializeComponent();
            valittu = false;
            // onko kuva piirtoAlueella
            onPiirtoAlueella = false;

            // Kuvan varsinainen osoite uudelleenrenderöintiä varten
            kuvanOsoite = _kuvanOsoite;
            // Luotetaan että aikaisemmin on tarkistettu että annettu osoite kuvaan on oikeastikki kuvan osoite
            LataaKuva();
            
		}
        public void Piirtoalue(Canvas _piirtoalue)
        {
            piirtoalue = _piirtoalue;
        }

        // Suorittaa kuvan tietojen lataamisen kontrollerille. Eli muokkaa kuvan tilanteeseen sopivalla tyylillä.
        private void LataaKuva()
        {
            BitmapImage _kuva = new BitmapImage();
            _kuva.BeginInit();
            _kuva.UriSource = new Uri(kuvanOsoite);
            if (onPiirtoAlueella == false)
            {
                _kuva.DecodePixelHeight = 120;
            }
            _kuva.EndInit();

            // Liitetään uudelleenkoodattu kuva näkyviin
            kuva.BeginInit();
            kuva.Source = _kuva; 
            kuva.EndInit();

            korkeus = _kuva.PixelHeight;
            leveys = _kuva.PixelWidth;

            if (onPiirtoAlueella == false)
            {
                this.Height = kuva.Height = (int)(_kuva.PixelHeight);
                this.Width = kuva.Width = (int)(_kuva.PixelWidth);
                // Ei näytetä kuvan koon muokkainta
                slider.Visibility = Visibility.Hidden;
                Canvas.SetZIndex(this, 1);
                
            }
            else
            {
                // Laitetaan systeemi oikeankokoiseksi
                kuva.Height = this.Height = (int)(_kuva.PixelHeight * 0.5);
                kuva.Width = this.Width = (int)(_kuva.PixelWidth * 0.5);
                // Näytetään koon muokkain
                slider.Visibility = Visibility.Visible;
                // Laitetaan päälimmäiseksi siirtoalueelle
                Canvas.SetZIndex(this, 11);
                slider.Value = 50;
            }
        }

        // Vaihdetaan kuvan kokoa, eli laataan uusi kuva...
        private void KoonVaihtaja_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            if (onPiirtoAlueella == true)
            {
                kuva.Height = this.Height = (int)(korkeus * (slider.Value / 100));
                kuva.Width = this.Width = (int)(leveys * (slider.Value / 100));
            }
        }

        // Kuvan eteen ja taakse liikutus ruudulla
        private void Kuva_MouseWheel(object sender, MouseWheelEventArgs e)
        {
            if (e.Delta > 0)
            {
                Canvas.SetZIndex(this, Canvas.GetZIndex(this) + 1);
                if (Canvas.GetZIndex(this) > 10)
                {
                    Canvas.SetZIndex(this, 0);
                }

            }
            else if (e.Delta < 0)
            {
                Canvas.SetZIndex(this, Canvas.GetZIndex(this) - 1);
                if (Canvas.GetZIndex(this) < 0)
                {
                    Canvas.SetZIndex(this, 10);
                }
            }
        }

        // Kuvan liikutuskomennot ->
        // Kuvan liikuttamiseen vaikuttavat toiminnot
        private void Kuva_MouseDown(object sender, MouseButtonEventArgs e)
        {
            if (onPiirtoAlueella == true)
            {

                // Otetaan talteen kohta, josta otettiin kuvaa kiinni
                hiiriSijaintiX = Mouse.GetPosition(piirtoalue).X - Canvas.GetLeft(this);
                hiiriSijaintiY = Mouse.GetPosition(piirtoalue).Y - Canvas.GetTop(this);

                // Tehdään hiiren kaappaus
                this.CaptureMouse();
                Canvas.SetZIndex(this, 11);

                // Laitetaan valituksi
                this.valittu = true;
            }
            else
            {
                if (KuvanSiirtoTapahtuma != null)
                {
                    KuvanSiirtoEventArgs kuvanSiirtoArgs = new KuvanSiirtoEventArgs(this, 1);
                    KuvanSiirtoTapahtuma(new object(), kuvanSiirtoArgs);
                    this.onPiirtoAlueella = true;
                    this.LataaKuva();

                    // Laitetaan hiiriSijainti oikeaksi
                    hiiriSijaintiX = kuva.Width / 2;
                    hiiriSijaintiY = kuva.Height / 2;

                    this.valittu = true;
                    // Tehdään hiiren kaappaus
                    this.CaptureMouse();

                }
            }
        }

        private void Kuva_MouseMove(object sender, MouseEventArgs e)
        {
            if (onPiirtoAlueella == true)
            {
                if (valittu == true)
                {
                    Canvas.SetTop(this, Mouse.GetPosition(piirtoalue).Y - hiiriSijaintiY);
                    Canvas.SetLeft(this, Mouse.GetPosition(piirtoalue).X - hiiriSijaintiX);
                }
            }
        }

        private void Kuva_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (onPiirtoAlueella == true)
            {
                // Poistetaan kuva piirtoalueelta
                if (Mouse.GetPosition(piirtoalue).Y > SystemParameters.WorkArea.Height - 150)
                {
                    if (KuvanSiirtoTapahtuma != null)
                    {
                        KuvanSiirtoEventArgs kuvanSiirtoArgs = new KuvanSiirtoEventArgs(this, 2);
                        KuvanSiirtoTapahtuma(new object(), kuvanSiirtoArgs);
                        this.onPiirtoAlueella = false;
                        this.LataaKuva();
                    }
                }

                this.ReleaseMouseCapture();
                Canvas.SetZIndex(this, 10);
                this.valittu = false;
            }
        }      
	}
}